VCCC2023 CSECT                                                          00000100
                                                                        00000202
* VINTAGE COMPUTING CHRISTMAS CHALLENGE 2023                            00000302
*                                                                       00000402
* SEE HTTPS://LOGIKER.COM/VINTAGE-COMPUTING-CHRISTMAS-CHALLENGE-2023    00000502
*                                                                       00000602
* TARGET: PRINT FOLLOWING IMAGE WITH                                    00000702
* MINIMAL EXECUTABLE CODE AS POSSIBLE                                   00000802
* --- ASTERISK IN FIRST ROW INDICATES COMMENT LINE ---                  00000902
                                                                        00001000
*       *     *     *                                                   00001102
*      * *   * *   * *                                                  00001202
*     *   * *   * *   *                                                 00001302
*    *     *     *     *                                                00001402
*     *   * *   * *   *                                                 00001502
*      * *   * *   * *                                                  00001602
*       *     *     *                                                   00001702
*      * *   * *   * *                                                  00001802
*     *   * *   * *   *                                                 00001902
*    *     *     *     *                                                00002002
*     *   * *   * *   *                                                 00002102
*      * *   * *   * *                                                  00002202
*       *     *     *                                                   00002302
*      * *   * *   * *                                                  00002402
*     *   * *   * *   *                                                 00002502
*    *     *     *     *                                                00002602
*     *   * *   * *   *                                                 00002702
*      * *   * *   * *                                                  00002802
*       *     *     *                                                   00002902
                                                                        00003000
*---------------------------------------------------------------------* 00003100
*                                                                     * 00003200
*        REGISTER USAGE                                               * 00003300
*                                                                     * 00003400
*        R3  COMMON COUNTER (FIGURES AND ROWS FOR OUTPUT)             * 00003500
*        R4  EVEN REGISTER FOR MULTIPLICATION / ROW NUMBER            * 00003600
*        R5  COLUMN NUMBER                                            * 00003700
*        R6  VERTICAL DIRECTION                                       * 00003800
*        R7  HORIZONTAL DIRECTION                                     * 00003900
*        R8  EVEN REGISTER FOR MULTIPLICATION                         * 00004000
*        R9  POSITION IN TABLE                                        * 00004100
*        R11 RETURN ADDRESS FOR CALLING SUBROUTINE                    * 00004200
*        R12 BASE REGISTER                                            * 00004300
*                                                                     * 00004400
*---------------------------------------------------------------------* 00004500
                                                                        00004600
         COPY  STDENTRY                STANDARD PROGRAM ENTRY           00004702
                                                                        00004800
         LA    R3,3                    PRINT 3 FIGURES                  00004902
                                                                        00005000
LOOP1    EQU   *                                                        00005100
                                                                        00005200
*---------------------------------------------------------------------* 00005300
*        CALCULATION OF START COLUMNS IN ROW 1                        * 00005400
*        (FIGURE COUNTER X 6 ) - 3     --> RESULT: 15, 9, 3           * 00005500
*        RESULT IS STORE IN R5                                        * 00005600
*---------------------------------------------------------------------* 00005700
         XR    R4,R4                   CLEAR EVEN REGISTER              00005800
         LA    R5,6                    SET ODD REGISTER TO 6            00005900
         MR    R4,R3                   MULTIPLY WITH COUNTER            00006000
         S     R5,=F'3'                SUBTRACT 3                       00006100
                                                                        00006200
*---------------------------------------------------------------------* 00006300
*        SET DEFAULT VALUES FOR EACH FIGURE                           * 00006400
*---------------------------------------------------------------------* 00006500
         XR    R4,R4                   INITIAL ROW NUMBER FOR FIGURE    00006600
         LA    R6,1                    SET VERTICAL DIRECTION DOWN      00006700
         LA    R7,1                    SET HORIZONTAL DIRECTION RIGHT   00006800
                                                                        00006900
LOOP2    EQU   *                                                        00007000
                                                                        00007100
*---------------------------------------------------------------------* 00007200
*        SET NEXT POSITION                                            * 00007300
*---------------------------------------------------------------------* 00007400
         AR    R4,R6                   NEXT VERTICAL POSITION           00007500
         AR    R5,R7                   NEXT HORIZONTAL POSITION         00007600
                                                                        00007700
*---------------------------------------------------------------------* 00007800
*        CALCULATE POSITION OF NEXT ASTERISK                          * 00007900
*---------------------------------------------------------------------* 00008000
         XR    R8,R8                   CLEAR EVEN REGISTER              00008100
         LA    R9,L'TABENTRY           LENGTH TABLE ENTRY               00008200
         MR    R8,R4                   MULTIPLY WITH ROW NUMBER         00008300
         AR    R9,R5                   ADD COLUMN NUMBER                00008400
         A     R9,=A(TABLE)            ADD TABLE ADDRESS                00008500
                                                                        00008600
*---------------------------------------------------------------------* 00008700
*        SET ASTERISK AT ACTUAL POSITION                              * 00008800
*---------------------------------------------------------------------* 00008900
         MVI   0(R9),C'*'              PLACE ASTERISK                   00009000
                                                                        00009100
         C     R4,=F'0'                FIRST LINE REACHED?              00009200
         BE    FIGUREND                YES, NEXT FIGURE                 00009300
                                                                        00009400
         C     R4,=F'18'               LAST LINE REACHED?               00009500
         BNE   COLCHECK                NO, CHECK HORIZONTAL POSITION    00009600
                                                                        00009700
         L     R6,=F'-1'               VERTICAL DIRECTION: UP           00009800
                                                                        00009900
COLCHECK EQU   *                                                        00010000
         C     R5,=F'0'                FIRST COLUMN REACHED?            00010100
         BNE   RIGHTBOR                NO, CHECK RIGHT BORDER           00010200
                                                                        00010300
         LA    R7,1                    HORIZONTAL DIRECTION: RIGHT      00010400
                                                                        00010500
RIGHTBOR EQU   *                                                        00010600
         C     R5,=F'18'               LAST COLUMN REACHED?             00010700
         BNE   LOOP2                   NO, PROCEED                      00010800
                                                                        00010900
         L     R7,=F'-1'               HORIZONTAL DIRECTION: LEFT       00011000
         B     LOOP2                   NO, PROCEED                      00011100
                                                                        00011200
FIGUREND EQU   *                                                        00011300
         BCT   R3,LOOP1                NEXT FIGURE                      00011400
                                                                        00011500
         OPEN  (OUTDCB,(OUTPUT))       OPEN OUTPUT FILE                 00011601
         LA    R9,TABLE                LOAD TABLE ADDRESS               00011700
         LA    R3,19                   SET COUNTER                      00011800
                                                                        00011900
LOOPOUT  EQU   *                                                        00012000
         MVC   OUTLINE(19),0(R9)       MOVE GRID LINE                   00012100
         PUT   OUTDCB,OUTAREA          PRINT LINE                       00012200
         A     R9,=F'19'               CALCULATE ADDRESS OF NEXT LINE   00012301
         BCT   R3,LOOPOUT              NEXT ENTRY                       00012400
                                                                        00012500
ENDE     EQU   *                                                        00012600
         CLOSE (OUTDCB)                CLOSE OUTPUT FILE                00012700
                                                                        00012800
EXIT     DS    0H                                                       00012900
         COPY  STDEXIT                 STANDARD PROGRAM EXIT            00013002
                                                                        00013100
OUTDCB   DCB   DSORG=PS,MACRF=(PM),DDNAME=OUTPUT,                      X00013200
               RECFM=FBA,LRECL=133,BLKSIZE=0                            00013300
OUTAREA  DS    0CL133                  OUTPUT RECORD                    00013400
OUTCHAR  DC    CL1' '                  LINE FEED FIELD                  00013504
OUTLINE  DC    CL132' '                OUTPUT CONTENT                   00013600
                                                                        00013700
         DS    0F                      FORCE ALIGNMENT                  00013800
                                                                        00013900
TABLE    DS    0CL361                  19 X 19                          00014000
TABENTRY DC    CL19' '                 FIRST LINE                       00014100
         DC    18CL19' '               REMAINING TABLE                  00014200
                                                                        00014300
         DS    0F                      FORCE ALIGNMENT                  00014400
                                                                        00014500
         COPY  REGEQUS                 DEFINITION OF REGISTER EQUALS    00014602
                                                                        00014700
         END                                                            00014800

